package com.qunar.paydata.platform.common.util;

import java.awt.Font;
import java.io.File;
import java.io.IOException;

import javax.servlet.http.HttpSession;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis3D;
import org.jfree.chart.axis.NumberAxis3D;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.data.category.DefaultCategoryDataset;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.qunar.paydata.platform.entity.co.WSNumChartBaseCo;

public class ChartUtil {
	
	private static Logger logger = LoggerFactory.getLogger(ChartUtil.class);
	
	/**
	 * 增加字体（在服务器没有安装相应字体的情况下）
	 */
	
	private static File file = null;
	public static void  initFontFile(HttpSession session){
		if (file == null) {
			String vPath = session.getServletContext().getRealPath("/");
			vPath = vPath + File.separator + "font" + File.separator + "simhei.ttf";
			file = new File(vPath);
		}
		
	}
	/**
	 * 获取所需字体
	 * @param style
	 * @param size
	 * @return
	 */
	private static Font getFont(int style, int size,HttpSession session) {
		Font defFont = new Font("黑体", style, size);
		try {
			initFontFile(session);
			if (file == null || !file.exists()) {
				return defFont;
			}
			Font nf = Font.createFont(Font.TRUETYPE_FONT, file);
			// Font.deriveFont() 方法用来创建一个新的字体对象
			nf = nf.deriveFont(style, size);
			return nf;
		} catch (Exception e) {
			logger.info("字体创建异常"+e);
		}
		return defFont;
	}
	public static void jfreeChart() {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		// 添加数据
		dataset.addValue(98, "数学", "张三");
		dataset.addValue(87, "语文", "张三");
		dataset.addValue(68, "数学", "李四");
		dataset.addValue(89, "语文", "李四");
		dataset.addValue(56, "数学", "王五");
		dataset.addValue(96, "语文", "王五");

		JFreeChart chart = ChartFactory.createBarChart3D("成绩统计表", "学生姓名",// X轴的标签
				"分数",// Y轴的标签
				dataset, // 图标显示的数据集合
				PlotOrientation.VERTICAL, // 图像的显示形式（水平或者垂直）
				true,// 是否显示子标题
				true,// 是否生成提示的标签
				true); // 是否生成URL链接
		// 处理图形上的乱码
		// 处理主标题的乱码
		chart.getTitle().setFont(new Font("宋体", Font.BOLD, 18));
		// 处理子标题乱码
		chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 15));
		// 获取图表区域对象
		CategoryPlot categoryPlot = (CategoryPlot) chart.getPlot();
		// 获取X轴的对象
		CategoryAxis3D categoryAxis3D = (CategoryAxis3D) categoryPlot
				.getDomainAxis();
		// 获取Y轴的对象
		NumberAxis3D numberAxis3D = (NumberAxis3D) categoryPlot.getRangeAxis();
		// 处理X轴上的乱码
		categoryAxis3D.setTickLabelFont(new Font("宋体", Font.BOLD, 15));
		// 处理X轴外的乱码
		categoryAxis3D.setLabelFont(new Font("宋体", Font.BOLD, 15));
		// 处理Y轴上的乱码
		numberAxis3D.setTickLabelFont(new Font("宋体", Font.BOLD, 15));
		// 处理Y轴外的乱码
		numberAxis3D.setLabelFont(new Font("宋体", Font.BOLD, 15));
		// 处理Y轴上显示的刻度，以10作为1格
		numberAxis3D.setAutoTickUnitSelection(false);
		NumberTickUnit unit = new NumberTickUnit(10);
		numberAxis3D.setTickUnit(unit);
		// 获取绘图区域对象
		BarRenderer3D barRenderer3D = (BarRenderer3D) categoryPlot
				.getRenderer();
		// 设置柱形图的宽度
		barRenderer3D.setMaximumBarWidth(0.07);
		// 在图形上显示数字
		barRenderer3D
				.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		barRenderer3D.setBaseItemLabelsVisible(true);
		barRenderer3D.setBaseItemLabelFont(new Font("宋体", Font.BOLD, 15));

		// 在D盘目录下生成图片
		File file = new File("D:/jfreechar/chart.jpeg");
		try {
			ChartUtilities.saveChartAsJPEG(file, chart, 800, 600);
		} catch (IOException e) {
			e.printStackTrace();
		}

		// 使用ChartFrame对象显示图像
		ChartFrame frame = new ChartFrame("xyz", chart);
		frame.setVisible(true);
		frame.pack();
	}
	
	/**
	 * 生成支付中心节点日报(柱状图)
	 */
	public static String genPayCentreReport(WSNumChartBaseCo wSNumChartBaseCo,HttpSession session,String endDate,Double totalNum) {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		// 添加数据
		// 错误工单
		dataset.addValue(wSNumChartBaseCo.getWrong_worksheet_wjl(), "王进洛", "错误工单");
		dataset.addValue(wSNumChartBaseCo.getWrong_worksheet_zjq(), "赵佳琪", "错误工单");
		dataset.addValue(wSNumChartBaseCo.getWrong_worksheet_lrh(), "李瑞昊", "错误工单");
		dataset.addValue(wSNumChartBaseCo.getWrong_worksheet_lcb(), "李成博", "错误工单");
		// 其他
		dataset.addValue(wSNumChartBaseCo.getOther_wjl(), "王进洛", "其他");
		dataset.addValue(wSNumChartBaseCo.getOther_zjq(), "赵佳琪", "其他");
		dataset.addValue(wSNumChartBaseCo.getOther_lrh(), "李瑞昊", "其他");
		dataset.addValue(wSNumChartBaseCo.getOther_lcb(), "李成博", "其他");
		// 实名问题
		dataset.addValue(wSNumChartBaseCo.getRealname_wjl(), "王进洛", "实名问题");
		dataset.addValue(wSNumChartBaseCo.getRealname_zjq(), "赵佳琪", "实名问题");
		dataset.addValue(wSNumChartBaseCo.getRealname_lrh(), "李瑞昊", "实名问题");
		dataset.addValue(wSNumChartBaseCo.getRealname_lcb(), "李成博", "实名问题");
		// 退款方面
		dataset.addValue(wSNumChartBaseCo.getRefund_wjl(), "王进洛", "退款方面");
		dataset.addValue(wSNumChartBaseCo.getRefund_zjq(), "赵佳琪", "退款方面");
		dataset.addValue(wSNumChartBaseCo.getRefund_lrh(), "李瑞昊", "退款方面");
		dataset.addValue(wSNumChartBaseCo.getRefund_lcb(), "李成博", "退款方面");
		// 账户咨询方面
		dataset.addValue(wSNumChartBaseCo.getAccunt_consult_wjl(), "王进洛", "账户咨询");
		dataset.addValue(wSNumChartBaseCo.getAccunt_consult_zjq(), "赵佳琪", "账户咨询");
		dataset.addValue(wSNumChartBaseCo.getAccunt_consult_lrh(), "李瑞昊", "账户咨询");
		dataset.addValue(wSNumChartBaseCo.getAccunt_consult_lcb(), "李成博", "账户咨询");
		// 支付方面
		dataset.addValue(wSNumChartBaseCo.getPayment_aspect_wjl(), "王进洛", "支付方面");
		dataset.addValue(wSNumChartBaseCo.getPayment_aspect_zjq(), "赵佳琪", "支付方面");
		dataset.addValue(wSNumChartBaseCo.getPayment_aspect_lrh(), "李瑞昊", "支付方面");
		dataset.addValue(wSNumChartBaseCo.getPayment_aspect_lcb(), "李成博", "支付方面");
		// 咨询返现方面
		dataset.addValue(wSNumChartBaseCo.getConsult_return_wjl(), "王进洛", "咨询返现");
		dataset.addValue(wSNumChartBaseCo.getConsult_return_zjq(), "赵佳琪", "咨询返现");
		dataset.addValue(wSNumChartBaseCo.getConsult_return_lrh(), "李瑞昊", "咨询返现");
		dataset.addValue(wSNumChartBaseCo.getConsult_return_lcb(), "李成博", "咨询返现");

		JFreeChart chart = ChartFactory.createBarChart3D("支付中心节点日报（"+endDate+"），总单数： "+totalNum+" 个", "操作人姓名",// X轴的标签
				"工单数",// Y轴的标签
				dataset, // 图标显示的数据集合
				PlotOrientation.VERTICAL, // 图像的显示形式（水平或者垂直）
				true,// 是否显示子标题
				true,// 是否生成提示的标签
				true); // 是否生成URL链接
		Font biger_18 = getFont(Font.BOLD, 18,session);
		Font little_15 = getFont(Font.BOLD, 15,session);
		// 处理图形上的乱码
		// 处理主标题的乱码
		chart.getTitle().setFont(biger_18);
		// 处理子标题乱码
		chart.getLegend().setItemFont(little_15);
		// 获取图表区域对象
		CategoryPlot categoryPlot = (CategoryPlot) chart.getPlot();
		// 获取X轴的对象
		CategoryAxis3D categoryAxis3D = (CategoryAxis3D) categoryPlot
				.getDomainAxis();
		// 获取Y轴的对象
		NumberAxis3D numberAxis3D = (NumberAxis3D) categoryPlot.getRangeAxis();
		// 处理X轴上的乱码
		categoryAxis3D.setTickLabelFont(little_15);
		// 处理X轴外的乱码
		categoryAxis3D.setLabelFont(little_15);
		// 处理Y轴上的乱码
		numberAxis3D.setTickLabelFont(little_15);
		// 处理Y轴外的乱码
		numberAxis3D.setLabelFont(little_15);
		// 处理Y轴上显示的刻度，以10作为1格
		numberAxis3D.setAutoTickUnitSelection(false);
		NumberTickUnit unit = new NumberTickUnit(10);
		numberAxis3D.setTickUnit(unit);
		// 获取绘图区域对象
		BarRenderer3D barRenderer3D = (BarRenderer3D) categoryPlot
				.getRenderer();
		// 设置柱形图的宽度
		barRenderer3D.setMaximumBarWidth(0.07);
		// 在图形上显示数字
		barRenderer3D
				.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		barRenderer3D.setBaseItemLabelsVisible(true);
		barRenderer3D.setBaseItemLabelFont(little_15);

		String url = session.getServletContext().getRealPath("/");
//		String url =System. getProperty ("user.dir");
		String num = Math.random()+"";
		File file = new File(url+"images/chart/chart_"+num+".jpeg");
		try {
			ChartUtilities.saveChartAsJPEG(file, chart, 1000, 600);
		} catch (IOException e) {
			e.printStackTrace();
		}

		// 使用ChartFrame对象显示图像
//		ChartFrame frame = new ChartFrame("xyz", chart);
//		frame.setVisible(true);
//		frame.pack();
		return num+"";
	}

	/**
	 * 生成固定日期工单数柱状图
	 */
	public static String genWorksheetNum(WSNumChartBaseCo wSNumChartBaseCo,HttpSession session,String beginDate,String endDate) {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		// 添加数据
		// 李成博
		dataset.addValue(wSNumChartBaseCo.getTotal_lcb(), "","李成博");
		//王进洛
		dataset.addValue(wSNumChartBaseCo.getTotal_wjl(), "", "王进洛");
		//李瑞昊
		dataset.addValue(wSNumChartBaseCo.getTotal_lrh(), "","李瑞昊");
		//赵佳琪
		dataset.addValue(wSNumChartBaseCo.getTotal_zjq(), "", "赵佳琪");
		
		
		JFreeChart chart = ChartFactory.createBarChart3D(("工单数（"+beginDate+"-"+endDate+"）"), "",// X轴的标签
				"工单数",// Y轴的标签
				dataset, // 图标显示的数据集合
				PlotOrientation.VERTICAL, // 图像的显示形式（水平或者垂直）
				true,// 是否显示子标题
				true,// 是否生成提示的标签
				true); // 是否生成URL链接
		// 处理图形上的乱码
		
		Font biger_18 = getFont(Font.BOLD, 18,session);
		Font little_15 = getFont(Font.BOLD, 15,session);
		// 处理主标题的乱码
		chart.getTitle().setFont(biger_18);
		// 处理子标题乱码
		chart.getLegend().setItemFont(little_15);
		// 获取图表区域对象
		CategoryPlot categoryPlot = (CategoryPlot) chart.getPlot();
		// 获取X轴的对象
		CategoryAxis3D categoryAxis3D = (CategoryAxis3D) categoryPlot
				.getDomainAxis();
		// 获取Y轴的对象
		NumberAxis3D numberAxis3D = (NumberAxis3D) categoryPlot.getRangeAxis();
		// 处理X轴上的乱码
		categoryAxis3D.setTickLabelFont(little_15);
		// 处理X轴外的乱码
		categoryAxis3D.setLabelFont(little_15);
		// 处理Y轴上的乱码
		numberAxis3D.setTickLabelFont(little_15);
		// 处理Y轴外的乱码
		numberAxis3D.setLabelFont(little_15);
		// 处理Y轴上显示的刻度，以50作为1格
		numberAxis3D.setAutoTickUnitSelection(false);
		NumberTickUnit unit = new NumberTickUnit(50);
		numberAxis3D.setTickUnit(unit);
		// 获取绘图区域对象
		BarRenderer3D barRenderer3D = (BarRenderer3D) categoryPlot
				.getRenderer();
		// 设置柱形图的宽度
		barRenderer3D.setMaximumBarWidth(0.07);
		// 在图形上显示数字
		barRenderer3D
				.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		barRenderer3D.setBaseItemLabelsVisible(true);
		barRenderer3D.setBaseItemLabelFont(little_15);

		String url = session.getServletContext().getRealPath("/");
		// 在D盘目录下生成图片
//		String url =System. getProperty ("user.dir");
		String num = Math.random()+"";
		File file = new File(url+"images/chart/ws_num_"+num+".jpeg");
		try {
			ChartUtilities.saveChartAsJPEG(file, chart, 1000, 600);
		} catch (IOException e) {
			e.printStackTrace();
		}

		// 使用ChartFrame对象显示图像
//		ChartFrame frame = new ChartFrame("xyz", chart);
//		frame.setVisible(true);
//		frame.pack();

		return num+"";
	}
}
